<?php
header('Content-Type: application/json');
Header('Access-Control-Allow-Methods:GET,POST,PUT,DELETE');
header("Access-Control-Allow-Headers: Content-Type");
header('Access-Control-Allow-Origin:*');   //跨域

require './mysql_init.php';

//判断post的数据类型是否有异常
function is_str($arr){
    $flag=true;
    foreach($arr as $k=>$v){
        if(gettype($v) !== "string"){
            $flag=false;
            break;
        }
    }
    if(!isEmail($arr[0])){
        $flag=false;
    }
    return $flag;
}
//判断是否是邮箱
function isEmail($email) {
    // 邮箱地址的正则表达式
    $pattern = "/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/";
    
    // 使用preg_match函数进行匹配
    if (preg_match($pattern, $email)) {
        return true; // 符合邮箱格式
    } else {
        return false; // 不符合邮箱格式
    }
}
//输入字符串时间，返回字符串时间与当前时间的差
function getTimeDifferenceInSeconds($strTime) {
    // 字符串时间转换为时间戳
    $timestamp = strtotime($strTime);

    date_default_timezone_set("PRC");     //设置时区，PRC是中国人民共和国
    
    // 获取当前时间戳
    $currentTimestamp = time();
    
    // 计算时间差
    $timeDiff = $currentTimestamp-$timestamp;
    
    // 返回时间差（秒）
    return $timeDiff;
}
//判断邮箱与验证码是否对应，以及时间是否合理
function panduan_captcha($pdo,$email,$captcha){
    try {
        // 准备查询语句
        $query = "SELECT captcha_register_email_time,captcha_register_email FROM register WHERE register_email = ?";
        $statement = $pdo->prepare($query);
        $statement->bindParam(1, $email);
        // 执行查询
        $statement->execute();
        // 获取结果
        $result = $statement->fetchAll()[0];      //把查询结构赋值给$count
        
        $time_difference=getTimeDifferenceInSeconds($result['captcha_register_email_time']);
        // 根据结果判断是否存在
        if ($result['captcha_register_email'] === $captcha && $time_difference <=60) {
            return 1; // pass
        } else if($result['captcha_register_email'] !== $captcha) {
            return 0; // 验证码错误
        }else{
            return 2;  //过期
        }
    } catch (PDOException $e) {
        // 异常处理
        echo "Error querying database: " . $e->getMessage();
        return -1; // 表示查询出错
    }
}
//获取当前时间,字符串形式
function get_time(){
    date_default_timezone_set("PRC");     //设置时区，PRC是中国人民共和国
    return date("Y-m-d H:i:s",time());  //以参数1的格式输出参数2，参数2是时间戳格式，参数1见格式表
}
//在users表中插入注册数据
function insert_data($pdo,$arr){
    $arr[4]=get_time();
    $arr[3]=hash('sha256',$arr[3]);
    try {
        // 准备插入语句并绑定参数
        $query = "INSERT INTO users(email,name,sex,password,register_time) values(?,?,?,?,?)";
        $statement = $pdo->prepare($query);
        // 执行插入操作
        $statement->execute($arr);
        
        // echo "Data inserted successfully.";
    } catch (PDOException $e) {
        echo "Error inserting data: " . $e->getMessage();
    }
}
function insert_data2($pdo,$user_uid){    //在login表中插入外键信息
    try {
        $captcha_login_email_n=0;
        $captcha_login_email_time='2000-10-08 10:07:56';
        // 准备插入语句并绑定参数
        $query = "INSERT INTO login(user_uid,captcha_login_email_n,captcha_login_email_time) values(?,?,?)";
        $statement = $pdo->prepare($query);
        $statement->bindParam(1, $user_uid);
        $statement->bindParam(2, $captcha_login_email_n);
        $statement->bindParam(3, $captcha_login_email_time);
        // 执行插入操作
        $statement->execute();
        
        // echo "Data inserted successfully.";
    } catch (PDOException $e) {
        echo "Error inserting data: " . $e->getMessage();
    }
}
//查询邮箱的uid
function get_uid($pdo,$email){
    try {
        // 准备查询语句
        $query = "SELECT uid FROM users WHERE email = ?";
        $statement = $pdo->prepare($query);
        $statement->bindParam(1, $email);
        // 执行查询
        $statement->execute();
        // 获取结果
        $result = $statement->fetchAll()[0]['uid'];      //把查询结构赋值给$count
        return $result;
    } catch (PDOException $e) {
        // 异常处理
        echo "Error querying database: " . $e->getMessage();
        return -1; // 表示查询出错
    }
}
//判断是否注册过
function is_register($pdo, $email) {
    try {
        // 准备查询语句
        $query = "SELECT COUNT(*) FROM users WHERE email = ?";
        $statement = $pdo->prepare($query);
        $statement->bindParam(1, $email);
        // 执行查询
        $statement->execute();
        // 获取结果
        $count = $statement->fetch()["COUNT(*)"];      //把查询结构赋值给$count
        // 根据结果判断是否存在
        if ($count > 0) {
            return false; // 存在
        } else {
            return true; // 不存在
        }
    } catch (PDOException $e) {
        // 异常处理
        echo "Error querying database: " . $e->getMessage();
        return -1; // 表示查询出错
    }
}
if ($_SERVER['REQUEST_METHOD'] === 'POST') {       //判断是否是post请求
    $response = array(
        'status' => 0,
        'message' => '进入post',
    );
    $json=file_get_contents('php://input');  //获取post请求中的原始数据
    $post_json=json_decode($json,true);       //把原始数据转化成json

    $name=$post_json["user_name"];
    $email=$post_json['user_email'];
    $sex=$post_json['user_sex'];
    $pwd=$post_json['user_password'];
    $captcha=$post_json['user_captcha'];
    $arr=array($email,$name,$sex,$pwd,$captcha);
    
    if (is_str($arr)) {         //判断是否有异常数据
        if(is_register($pdo, $email)){      //判断是否注册过
            if(panduan_captcha($pdo,$email,$captcha)===1){      //判断验证码是否正确，是否过期
                insert_data($pdo,$arr);      //插入注册信息到users表
                $user_uid=get_uid($pdo,$email);
                insert_data2($pdo,$user_uid);    //在login表中插入外键信息
                $response = array(
                    'status' => 1,
                    'message' => '注册成功',
                );
            }else if(panduan_captcha($pdo,$email,$captcha)===2){
                $response = array(
                    'status' => 0,
                    'message' => '验证码过期',
                );
            }else{
                $response = array(
                    'status' => 0,
                    'message' => '验证码或邮箱错误',
                );
            }
        }else{           //注册过了
            $response = array(
                'status' => 0,
                'message' =>'已经注册过了',
            );
        }
        
    }else{
        $response = array(
            'status' => 0,
            'message' => '参数类型错误',
        );
    }
    echo json_encode($response);
}else{
    $response = array(
        'status' => 0,
        'message' => '不是post',
    );
    echo json_encode($response);
}
?>